/***
  globalServer.java is part of Marioneta.

  Marioneta is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License.

  Marioneta is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
  
  @author martin
   Martin Edmundo Barriga Orozco, 2008
   martin.barriga@gulmore.org
  
  globalServer: Se encarga de abrir un puerto en el cual va a escuchar
  las peticiones de los clientes, una vez iniciado, lanza cada thread como
  solicitudes tenga para atender a los clientes.
 */

package escritorioremoto;

import java.net.ServerSocket;
import java.net.Socket;
import java.io.IOException;

public class globalServer extends Thread {
    //Puerto por defecto
    private final int PORTio =  5000;
    private final int PORTimg = 5001;
    
    private ServerSocket skServer;
    private Socket listenSocket;
    private int port;
    int id_cte;
    private boolean debo_vivir;
    
    private imgServer serverX;
    doImgServer multi_imagenes;
    
    /**
     * Construye un nuevo globalServer, inicializando sus valores necesarios
     * @param port Puerto en el cual el servidor globla escuchara peticiones
     */
    public globalServer(int port){
        this.port = port;
        try{
            skServer = new ServerSocket( port );
            this.setStatus( true );
            this.id_cte = 0;
        }
        catch(IOException e){
            System.out.println("Error al abrir puerto: " + e.getMessage() );
            this.setStatus( false );
        }
    }
    
    /**
     * Construye un nuevo globalServer, inicializando sus valores necesarios
     */
    public globalServer(){
        this.port = this.PORTio;
        try{
            skServer = new ServerSocket( port );
            this.setStatus( true );
        }
        catch(IOException e){
            System.out.println("Error al abrir puerto: " + e.getMessage() );
            this.setStatus( false );
        }
    }
    
    /**
     * Se encarga de lanzar de uno por uno los thread que atiende a los lientes
     * este metodo es privado y debera ser lanzando unicamente y de manera local
     * por cada servidor 
     */
    private void atiende_clientes(){
        System.out.println("Escuchando en pueto "+ port +"...");
        while(debo_vivir){
            try{
                listenSocket = skServer.accept();
                //gui_server gui = new gui_server( listenSocket, multi_imagenes);
                gui_server gui = new gui_server( listenSocket);
            }
            catch( IOException e ){
                System.out.println("Error al iniciar la conexion con el cliente: " + e.getMessage() );
                System.out.println("Saliendo...");
                this.setStatus( false );
            }
        }
        System.out.println("Deteniendo Servidor...");
    }
    
     /**
     * Nos indica si el servidor esta corriendo o no
     * @return <b>true</b> si el servidor esta corriendo
     * <b>false</b> si el servidor ya no esta corriendo
     */
    public boolean getStatus(){
        return this.debo_vivir;
    }
    
    /**
     * Modificamos el estado del servidor, cuando el servidor inicia lo hace con
     * un setStatus de true.
     * @param stat se manda false en el caso que se desee dentener el servidor.
     */
    public void setStatus(boolean stat ){
        debo_vivir = stat;
    }
    
    /**
     * Se encarga de lanzar el servidor como thread, y a su vez invoca a un metodo
     * de atencion a clientes, es aqui donde se lanza la comunucacion con cada
     * cliente que se conecte. Debera ser usado a travez del metodo start().
     */
    @Override public void run() {
        //Se crea el servidor que atiende a las imagenes
        //serverX = new imgServer( PORTimg );
        //Thread obj = new Thread( serverX );
        //obj.start();
        
        //multi_imagenes = new doImgServer( PORTimg );
        
        this.atiende_clientes();
    }
    
}